const axios = require('axios');

// 测试规则引擎与PLC交互的脚本

async function testRulesEnginePLCInteraction() {
    try {
        console.log('测试规则引擎与PLC交互...\n');
        
        // 1. 发送变量更新到规则引擎
        console.log('1. 发送变量更新到规则引擎:');
        const variables = {
            'DB1,W0': 1,      // 货位1状态为就绪
            'DB1,REAL6': 70   // 温度为70度（正常范围）
        };
        
        const response = await axios.post('http://localhost:3004/api/variables', {
            variables: variables
        });
        
        console.log('   ✅ 变量更新发送成功:', response.data);
        
        // 2. 检查规则是否触发
        console.log('\n2. 检查规则是否触发:');
        console.log('   根据规则配置，当货位1状态为就绪且温度正常时应该启动电机');
        console.log('   即: DB1,W0 === 1 且 DB1,REAL6 < 75');
        console.log('   当前状态: DB1,W0 =', variables['DB1,W0'], ', DB1,REAL6 =', variables['DB1,REAL6']);
        console.log('   预期结果: 规则应该触发，向PLC写入DB2,X0.0 = true');
        
        // 3. 等待一段时间让规则引擎处理
        console.log('\n3. 等待规则引擎处理...');
        await new Promise(resolve => setTimeout(resolve, 2000));
        
        // 4. 验证PLC写入操作是否通过队列服务执行
        console.log('\n4. 验证PLC写入操作是否通过队列服务执行:');
        console.log('   检查队列服务历史记录:');
        
        try {
            const historyResponse = await axios.get('http://localhost:3003/api/queue/history');
            const history = historyResponse.data;
            
            // 查找最近的PLC写入任务
            const plcWriteTasks = history.filter(item => 
                item.task && item.task.type === 'plc-write'
            );
            
            if (plcWriteTasks.length > 0) {
                console.log('   ✅ 发现PLC写入任务:');
                plcWriteTasks.slice(-3).forEach(task => {
                    console.log('     -', JSON.stringify(task.task));
                });
            } else {
                console.log('   ⚠️ 未发现PLC写入任务，可能规则未触发或仍在处理中');
            }
        } catch (error) {
            console.log('   ❌ 无法获取队列服务历史记录:', error.message);
        }
        
        console.log('\n-------------------\n');
        
        // 5. 测试温度过高规则
        console.log('5. 测试温度过高规则:');
        const highTempVariables = {
            'DB1,REAL6': 85   // 温度为85度（超过80度阈值）
        };
        
        const highTempResponse = await axios.post('http://localhost:3004/api/variables', {
            variables: highTempVariables
        });
        
        console.log('   ✅ 高温变量更新发送成功:', highTempResponse.data);
        console.log('   根据规则配置，当温度超过80度时应该触发警告');
        
        // 6. 等待规则引擎处理
        console.log('\n6. 等待规则引擎处理...');
        await new Promise(resolve => setTimeout(resolve, 2000));
        
        console.log('\n测试完成。请检查规则引擎和队列服务的控制台输出以获取详细信息。');
        
    } catch (error) {
        console.error('测试过程中出现错误:', error.message);
    }
}

// 如果直接运行此脚本，则执行测试
if (require.main === module) {
    testRulesEnginePLCInteraction();
}

module.exports = {
    testRulesEnginePLCInteraction
};